package cn.js.sangu.unitStore.service;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.js.sangu.unitStore.common.config.MyAppConfig;
import cn.js.sangu.unitStore.entity.FileNas;
import cn.js.sangu.unitStore.mapper.FileMapper;
import cn.js.sangu.unitStore.utils.LinsUtil;
import cn.js.sangu.unitStore.utils.TokenUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Objects;

/**
 * 文件管理
 */
@Slf4j
@Service
public class FileService extends ServiceImpl<FileMapper,FileNas> {

//    @Value("${system.ip:localhost}")
//    String ip;

    //实际文件存储父目录:当前项目路径:D:\Project\idea\store
//    public static final String ROOT_PATH = "E:\\TEMP\\UnitStore\\File";
//    public static final String ROOT_PATH = "Y:\\001\\UnitStore\\File";
    static final String ROOT_PATH = System.getProperty("user.dir") +File.separator+ "files";
    static String today = DateUtil.today();
    static String folderRootPath = ROOT_PATH + File.separator + today +File.separator;

    @Resource
    FileMapper fileMapper;

    @Resource
    MyAppConfig myAppConfig;

    public FileNas upload(MultipartFile file) throws IOException {
        //原始文件名
        String originalFilename = null;
        try {
            //文件原始名称(文件名+文件类型)
            originalFilename = file.getOriginalFilename();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //不包含类型的主文件名
        String mainName = FileUtil.mainName(originalFilename);
        //文件后缀
        String extName = FileUtil.extName(originalFilename);

        //完整文件路径
        String FullRootPath = folderRootPath+ originalFilename;

        //当前上传文件已存在，则新文件需重命名
        if (FileUtil.exist(FullRootPath)){
            //高并发时，时间戳也不安全
            originalFilename = mainName+"-"+System.currentTimeMillis()+"."+extName;
            //注意是重新拼接
            FullRootPath = folderRootPath + originalFilename;
        }

        //判断文件的父目录是否存在，不存在则创建
        boolean b = FileUtil.exist(folderRootPath);
        if (!b){
            FileUtil.mkdir(folderRootPath);
        }

        //文件夹路径+加时间戳以后的文件名
        File saveFile = new File(FullRootPath);

        //存储文件到磁盘
        file.transferTo(saveFile);

        //生成文件记录
        FileNas fileNas = new FileNas();
        fileNas.setFileName(originalFilename);
        fileNas.setFilePath(FullRootPath);
        fileNas.setFileSize(LinsUtil.computeFileSize(file.getSize()));
        fileNas.setFileType(1);
        fileNas.setUserId(Objects.requireNonNull(TokenUtils.getCurrentUser()).getId());
        //开启了映射则用新ip
        fileNas.setFileUrl(myAppConfig.getHttps()+(myAppConfig.getPortMapping()?myAppConfig.getMappingIp():myAppConfig.getIp())+"/file/download/0/"+today+"/"+originalFilename);
        super.save(fileNas);
        return fileNas;
    }

    public FileNas download(Integer id) {
        if (null != id && 0 != id){
            //若id有效,直接更新,优先以id匹配文件
            fileMapper.incrementDownCountById(id);
            return fileMapper.selectById(id);
        }
        return null;
    }

    public String download(Integer id,String today,String fileName) {
        String fullRootPath = ROOT_PATH + File.separator + today + File.separator + fileName;
        if (null != id && 0 != id){
            //若id有效,直接更新,优先以id匹配文件
            fileMapper.incrementDownCountById(id);
            FileNas fileNas = fileMapper.selectById(id);
            if (StrUtil.isNotBlank(fileNas.getFilePath())){
                fullRootPath = fileNas.getFilePath();
            }
        }else if (StrUtil.isNotBlank(fileName)){
            //若没有id，一般不是真正意义上的下载，可能只是预览查看，无需入库
            //文件名路径有效
//            fileMapper.incrementDownCountByFilePath(fullRootPath);
//            QueryWrapper<FileNas> wrapper = new QueryWrapper<>();
//            wrapper.eq(StrUtil.isNotBlank(fullRootPath),"file_path",fullRootPath);
//            FileNas fileNas = fileMapper.selectOne(wrapper);
        }
        return fullRootPath;
    }

}
